package com.jnxx.basic.util;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import com.jnxx.basic.enumException.GlobalExceptionEnum;
import com.jnxx.basic.exception.GlobalException;
import com.jnxx.task.domain.OkrStaff;

import java.security.KeyPair;
import java.util.HashMap;

public class JwtUtils {
    // 使用RSA算法获取一个随机code
    private static byte[] encoded = null;
    static {
        KeyPair rsa = SecureUtil.generateKeyPair("RSA");
        encoded = rsa.getPrivate().getEncoded();

    }
    // 获取token，传入一个 staff对象
    public static String getToken(OkrStaff staff){
        // 使用hutool工具生成一个当前时间
        DateTime now = DateTime.now();
        // 当前时间延后30分钟的时间，也就相当于过期时间设置为30分钟
        DateTime offset = now.offset(DateField.MINUTE, 30);
        HashMap<String, Object> map = new HashMap<>();

        map.put(JWTPayload.EXPIRES_AT, offset);
        map.put(JWTPayload.ISSUED_AT, now);
        map.put(JWTPayload.NOT_BEFORE, now);
        // 将传入的对象 使用 JWTUtil生成一个token对象，这个对象里面包含我们传入的对象，可以被解析出来
        map.put("staff", staff);
        return JWTUtil.createToken(map,encoded);
    }
    // 解析token
    public static OkrStaff parseToken(String token){
        // 利用JWTUtil解析token，获得一个 JWT对象
        JWT jwt = JWTUtil.parseToken(token);
        // 将jwt对象转换为JSONObject对象
        JSONObject payloads = jwt.getPayloads();
        if (payloads == null){
            throw new GlobalException(GlobalExceptionEnum.ERROR);
        }
        // 从JSONObject对象中获取我们存入的staff
        Object payload = payloads.get("staff");
        if (payload == null){
            throw new GlobalException(GlobalExceptionEnum.ERROR);
        }
        // 将解析完成的payload转换为java对象
        return com.alibaba.fastjson.JSONObject.parseObject(com.alibaba.fastjson.JSONObject.toJSONString(payload), OkrStaff.class);
    }
    // 验证token是否我们封装的token
    public static boolean veryfy(String token){
        return JWTUtil.verify(token, encoded);
    }

}
